﻿#ifndef CDATABASEMGRBASE_H
#define CDATABASEMGRBASE_H

#include "dbstruct.h"
#include "cdbtabledatainfo.h"

//数据库管理类
class CDatabaseMgrBase
{
public:
    enum enumDbConnectType
    {
        enDBRead,     //读
        enDBWrite,    //写
    };

    /***************************************************************
    * @datatime 2023-12-07 09:32:48
    * @author   jhb
    * @brief    开启事务
    * @input    const QString &strId 事务唯一ID
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    virtual bool transaction(const QString &strId, int nType = enDBWrite) = 0;

    /***************************************************************
    * @datatime 2023-12-07 09:35:32
    * @author   jhb
    * @brief    提交事务
    * @input    const QString &strId 事务唯一ID
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    virtual bool commit(const QString &strId) = 0;

    /***************************************************************
    * @datatime 2023-12-07 09:35:37
    * @author   jhb
    * @brief    回滚事务
    * @input    const QString &strId 事务唯一ID
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    virtual bool rollback(const QString &strId) = 0;

    /***************************************************************
    * @datatime 2023-12-07 13:16:38
    * @author   jhb
    * @brief    获取数据库操作信息
    * @input    const int &nTable   库表索引
    *           const int &nLock    锁模式
    * @output   无
    * @return   DbDataInfo* 数据库操作信息指针
    * @note
    ****************************************************************/
    virtual CDbTableDataInfo *getDbDataInfo(const int &nTable, const int &nLock = enBLOCK) = 0;

    /***************************************************************
    * @datatime 2023-12-07 13:16:38
    * @author   jhb
    * @brief    获取数据库操作信息
    * @input    const QString &strTable 库表名
    *           const int &nLock    锁模式
    * @output   无
    * @return   DbDataInfo* 数据库操作信息指针
    * @note
    ****************************************************************/
    virtual CDbTableDataInfo *getDbDataInfo(const QString &strTable, const int &nLock = enBLOCK) = 0;

    /***************************************************************
    * @datatime 2023-12-07 10:19:40
    * @author   jhb
    * @brief    获取执行结果
    * @input    const int &nTable   库表索引
    *           const int &nLock    资源锁解锁方式，默认非SELECT执行成功或SELECT执行失败，则自动解锁
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    virtual bool getResult(const int &nTable, const int &nLock = enLockSELECT) = 0;

    /***************************************************************
    * @datatime 2023-12-07 10:34:03
    * @author   jhb
    * @brief    获取执行结果
    * @input    const QString &strTable 数据库表名
    *           const int &nLock    资源锁解锁方式，默认非SELECT执行成功或SELECT执行失败，则自动解锁
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual bool getResult(const QString &strTable, const int &nLock = enLockSELECT) = 0;

    /***************************************************************
    * @datatime 2024-03-07 15:20
    * @author   jhb
    * @brief    使用结构体数据直接执行SQL,返回结果
    * @input    const int &nLock            资源锁解锁方式，默认自动解锁,非阻塞形式
    * @output   CDatabaseExecData &data     数据库执行数据
    * @return   无
    * @note
    ****************************************************************/
    virtual bool exec(CDatabaseExecData &data, const int &nLock = enNONBLOCK) = 0;
};

class CDbMgrInfo
{
public:
    CDatabaseMgrBase *m_pDb;
};
Q_DECLARE_METATYPE(CDbMgrInfo)

#endif  //CDATABASEMGRBASE_H
